"""Pass 系统

提供编译器 Pass 的基础设施和注册机制。"""

from typing import Optional

from .base import BasePass
from .group_merge import GroupMergePass
from .dataflow_analysis import DataFlowAnalysisPass
from .type_inference import TypeInferencePass
from .type_replacement import TypeReplacementPass
from .parameter_analysis import ParameterAnalysisPass
from .declaration_analysis import DeclarationAnalysisPass
from .async_analysis import AsyncAnalysisPass
from .await_transform import AwaitTransformPass


# Pass 注册表
_pass_registry = {
    "group_merge": GroupMergePass,
    "dataflow_analysis": DataFlowAnalysisPass,
    "type_inference": TypeInferencePass,
    "type_replacement": TypeReplacementPass,
    "parameter_analysis": ParameterAnalysisPass,
    "declaration_analysis": DeclarationAnalysisPass,
    "async_analysis": AsyncAnalysisPass,
    "await_expression_transform": AwaitTransformPass,
}

# 默认 Pass 管道顺序
_default_pass_order = [
    "await_expression_transform",  # await 表达式转换（将复杂表达式拆分为多个语句，需要在类型推导之前）
    "type_inference",  # 统一的类型推导Pass，仅处理 Python 类型信息（包括临时变量）（集成了类型收窄）
    "async_analysis",  # 异步函数分析（需要在类型推导之后）
    "declaration_analysis",  # 分析变量声明（需要在数据流分析之前）
    "dataflow_analysis",  # 数据流分析（逃逸分析、Def-Use Chain等，依赖 declaration_analysis）
    "type_replacement",  # C++ 类型替换（包括 async 函数返回类型的 mc::result<T> 包装）
    "parameter_analysis",
    "group_merge",
]


def get_default_passes(config: Optional[dict] = None) -> list[BasePass]:
    """获取默认的 Pass 列表

    Args:
        config: 编译器配置

    Returns:
        list[BasePass]: 配置好的 Pass 列表
    """
    if config is None:
        config = {}

    # 提取编译器配置
    compiler_config = config.get("compiler", {})

    passes = []
    for pass_name in _default_pass_order:
        pass_class = _pass_registry[pass_name]
        # 检查 Pass 是否支持配置参数
        try:
            pass_instance = pass_class(compiler_config)
        except TypeError:
            # 如果 Pass 不支持配置参数，使用默认构造函数
            pass_instance = pass_class()
        passes.append(pass_instance)

    return passes


def get_all_passes():
    """获取所有注册的 Pass 类

    Returns:
        Dict[str, Type[BasePass]]: Pass 名称到类的映射
    """
    return _pass_registry.copy()


def register_pass(name: str, pass_class: type):
    """注册新的 Pass

    Args:
        name: Pass 名称
        pass_class: Pass 类
    """
    _pass_registry[name] = pass_class
